/**
 * 文件验证工具
 */

// 文件大小限制（单位：MB）
export const FILE_SIZE_LIMITS = {
  IMAGE: 10, // 10MB
  DOCUMENT: 50, // 50MB
  VIDEO: 200, // 200MB
  AUDIO: 100, // 100MB
  GENERAL: 100, // 100MB
} as const

// 文件类型定义
export const FILE_TYPES = {
  IMAGE: ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'],
  DOCUMENT: ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt'],
  VIDEO: ['mp4', 'avi', 'mov', 'wmv', 'flv', 'mkv'],
  AUDIO: ['mp3', 'wav', 'ogg', 'aac', 'flac'],
  ARCHIVE: ['zip', 'rar', '7z', 'tar', 'gz'],
} as const

// 验证结果接口
export interface ValidationResult {
  valid: boolean
  error?: string
}

/**
 * 获取文件扩展名
 */
export function getFileExtension(filename: string): string {
  return filename.split('.').pop()?.toLowerCase() || ''
}

/**
 * 格式化文件大小
 */
export function formatFileSize(bytes: number): string {
  if (bytes === 0) return '0 B'
  
  const k = 1024
  const sizes = ['B', 'KB', 'MB', 'GB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}

/**
 * 检查文件大小
 */
export function checkFileSize(file: File, limitMB: number): ValidationResult {
  const limitBytes = limitMB * 1024 * 1024
  
  if (file.size > limitBytes) {
    return {
      valid: false,
      error: `文件大小不能超过 ${limitMB}MB，当前文件大小：${formatFileSize(file.size)}`
    }
  }
  
  return { valid: true }
}

/**
 * 检查文件类型
 */
export function checkFileType(file: File, allowedTypes: string[]): ValidationResult {
  const extension = getFileExtension(file.name)
  
  if (!allowedTypes.includes(extension)) {
    return {
      valid: false,
      error: `不支持的文件类型：${extension}，支持的类型：${allowedTypes.join(', ')}`
    }
  }
  
  return { valid: true }
}

/**
 * 验证图片文件
 */
export function validateImageFile(file: File): ValidationResult {
  // 检查文件类型
  const typeResult = checkFileType(file, FILE_TYPES.IMAGE)
  if (!typeResult.valid) {
    return typeResult
  }
  
  // 检查文件大小
  const sizeResult = checkFileSize(file, FILE_SIZE_LIMITS.IMAGE)
  if (!sizeResult.valid) {
    return sizeResult
  }
  
  return { valid: true }
}

/**
 * 验证文档文件
 */
export function validateDocumentFile(file: File): ValidationResult {
  // 检查文件类型
  const typeResult = checkFileType(file, FILE_TYPES.DOCUMENT)
  if (!typeResult.valid) {
    return typeResult
  }
  
  // 检查文件大小
  const sizeResult = checkFileSize(file, FILE_SIZE_LIMITS.DOCUMENT)
  if (!sizeResult.valid) {
    return sizeResult
  }
  
  return { valid: true }
}

/**
 * 验证视频文件
 */
export function validateVideoFile(file: File): ValidationResult {
  // 检查文件类型
  const typeResult = checkFileType(file, FILE_TYPES.VIDEO)
  if (!typeResult.valid) {
    return typeResult
  }
  
  // 检查文件大小
  const sizeResult = checkFileSize(file, FILE_SIZE_LIMITS.VIDEO)
  if (!sizeResult.valid) {
    return sizeResult
  }
  
  return { valid: true }
}

/**
 * 验证音频文件
 */
export function validateAudioFile(file: File): ValidationResult {
  // 检查文件类型
  const typeResult = checkFileType(file, FILE_TYPES.AUDIO)
  if (!typeResult.valid) {
    return typeResult
  }
  
  // 检查文件大小
  const sizeResult = checkFileSize(file, FILE_SIZE_LIMITS.AUDIO)
  if (!sizeResult.valid) {
    return sizeResult
  }
  
  return { valid: true }
}

/**
 * 验证通用文件
 */
export function validateGeneralFile(file: File): ValidationResult {
  // 获取所有允许的文件类型
  const allTypes = [
    ...FILE_TYPES.IMAGE,
    ...FILE_TYPES.DOCUMENT,
    ...FILE_TYPES.VIDEO,
    ...FILE_TYPES.AUDIO,
    ...FILE_TYPES.ARCHIVE
  ]
  
  // 检查文件类型
  const typeResult = checkFileType(file, allTypes)
  if (!typeResult.valid) {
    return typeResult
  }
  
  // 检查文件大小
  const sizeResult = checkFileSize(file, FILE_SIZE_LIMITS.GENERAL)
  if (!sizeResult.valid) {
    return sizeResult
  }
  
  return { valid: true }
}

/**
 * 根据文件类型自动验证
 */
export function validateFileByType(file: File, type?: string): ValidationResult {
  const extension = getFileExtension(file.name)
  
  // 如果指定了类型，使用指定的验证
  if (type) {
    switch (type) {
      case 'image':
        return validateImageFile(file)
      case 'document':
        return validateDocumentFile(file)
      case 'video':
        return validateVideoFile(file)
      case 'audio':
        return validateAudioFile(file)
      default:
        return validateGeneralFile(file)
    }
  }
  
  // 根据扩展名自动判断类型
  if (FILE_TYPES.IMAGE.includes(extension)) {
    return validateImageFile(file)
  } else if (FILE_TYPES.DOCUMENT.includes(extension)) {
    return validateDocumentFile(file)
  } else if (FILE_TYPES.VIDEO.includes(extension)) {
    return validateVideoFile(file)
  } else if (FILE_TYPES.AUDIO.includes(extension)) {
    return validateAudioFile(file)
  } else {
    return validateGeneralFile(file)
  }
}

/**
 * 检查是否为图片文件
 */
export function isImageFile(file: File): boolean {
  const extension = getFileExtension(file.name)
  return FILE_TYPES.IMAGE.includes(extension)
}

/**
 * 检查是否为文档文件
 */
export function isDocumentFile(file: File): boolean {
  const extension = getFileExtension(file.name)
  return FILE_TYPES.DOCUMENT.includes(extension)
}

/**
 * 检查是否为视频文件
 */
export function isVideoFile(file: File): boolean {
  const extension = getFileExtension(file.name)
  return FILE_TYPES.VIDEO.includes(extension)
}

/**
 * 检查是否为音频文件
 */
export function isAudioFile(file: File): boolean {
  const extension = getFileExtension(file.name)
  return FILE_TYPES.AUDIO.includes(extension)
}
